鐵人賽跟昨日蠻像的,但今天是介紹 supervisor level 的部分
當 sip/siph 為 1時,sip/siph 中的 bit 為可寫的,並且保持 set 直到有軟體將他們清除。與 machine level 一樣,supervisor level interrupt trap 基本上與RISC-V 架構所規定的相同,當以下情況均成立時,會 trap 進到 S mode
sip/siph 和 sie/sieh 中匹配到相同bit,或者實現 hypervisor extension, hip和 hie 匹配相同 bit。hideleg/hidelegh 中對應的 bit 應為 0。supervisor-level 的 major interrupt 優先順序可以透過 siselect和 sireg access supervisor level ipriok 來進行配置。
當SXLEN=32 或是 64時,該array的結構與當 MXLEN=32 或 64 的 machine level iprio array 相同,總結來說,當SXLEN=32時,有16個32bit 具有這些 siselect address:
每個暫存器控制四個 interrupt 的優先順序,每個 interrupt 為 8bit,當SXLEN=64 時,只有偶數暫存器存在:

每個暫存器控制八個interrupt的優先順序,如果 SXLEN=64 且 sisekect 是0x31~0x3F範圍的奇數值,則嘗試 access sireg 會引發 illegal instruction exception。
有效的暫存器iprio0~iprio15統稱之為supervisor level的iprio array,有效的 ipriok 每個 byte 要麽只讀0或正好是 IPRIOLEN 的整數欄位。
對於給定的 interrupt number,如果 sie/sieh 所對應的bit為read-only 0,則在 supervisor level iprio array 中的 interrupt 優先順序也應read-only 0。
supervisor level exterrnal interrupt (iprio2 的bit 15:8) 的優先順序也應read-only 0,除了這兩個限制外,可以自由選擇哪些優先順序欄位是可設定的,哪寫是read-only 0的。
當 trap 到 s mode時,透過 sislecet和 sireg access supervisor level iprio array 會影響 interrupt 的優先順序。當interrupt 在 array 優先順序為0時,其優先順序回默認值。
將一個 interrupt 的優先順序設定為非零值p,使該 interrupt 具有與優先順序p supervisor level external interrupt具有相同優先順序。對於默認優先順序大於supervisor level external interrupt,將其優先順序設定為非0值會降低其優先順序
supervisor level stopi 是一個read-only 的 CSR 寬度為 SXLEN。讀取 stopi 回傳supervisor level 最高優先順序和啟用的 interrupt 資訊,下面為 stopi 格式:

stopi 的其他 bit 則保留為read 0
除了以下情況,stopi 的值皆為0
sip/siph 舉起,且sie/sieh舉起,或者實現hypervisor extension,hip 舉起並且hie舉起sideleg或是 hideleg 存在,則 interrupt 不會被委派到較低level的特權級別。當有 supervisor level major interrupt 的pernding 和 enabled 被舉起時,欄位IID為最高優先順序的主要ID,欄位IPRIO表示其優先順序如果 supervisor-level iprio array 均 read-only 0,則允許簡化欄位IPRIO的實現,其中 stopi 不為0,其值始終為1。
反之,當 stopi 不為0時,如果 interrupt 的優先順序在1~255之間,則IPRIO就是該值,如果 interrupt 的優先順序為0或是大於255,則IPRIO設定為0或是255,如下所示:
如果 interrupt 的優先順序大於255,則 IPRIO 為255(最低優先順序)
如果 interrupt 的優先順序為0,並且 interrupt ID 的默認優先順序大於supervisor external interrupt,則 IPRIO 為0(最高優先順序)
如果 interrupt 的優先順序為0,並且interrupt ID的默認優先順序小於supervisor external interrupt,則IPRIO為 255。
RISCV 特權架構確保,當 stopi 的值不為0時,如果當時特權模式為s且 sstatus的SIE 也set,或當時特權模式的特權小於S mode,將trap設為s mode,trap不會導致 stopi 的值發生改變。
以下pseudocode顯示supervisor level的trap如何讀取 stopi,以避免在interrupt到達前,處理另一trap時出現多餘恢復和保存暫存器的行為。
